﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using ReservasServices.Persistencia;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using ReservasServices.Dominio;
using System.Collections;
using System.Messaging;

namespace ReservasServices
{
    // NOTA: puede usar el comando "Rename" del menú "Refactorizar" para cambiar el nombre de clase "Service1" en el código, en svc y en el archivo de configuración.
    public class Reservas : IReserva
    {
        private ReservaDAO reservaDAO = new ReservaDAO();

        public string evaluarHora(int hora)
        {
            switch (hora)
            {
                case 8:
                    return "8:00";
                case 9:
                    return "9:00";
                case 10:
                    return "10:00";
                case 11:
                    return "11:00";
                case 12:
                    return "12:00";
                case 13:
                    return "13:00";
                case 14:
                    return "14:00";
                case 15:
                    return "15:00";
                case 16:
                    return "16:00";
                case 17:
                    return "17:00";
                default:
                    return "18:00";
            }

        }

        public string evaluarDia(int dia)
        {
            switch (dia)
            {
                case 1:
                    return "Lunes";
                case 2:
                    return "Martes";
                case 3:
                    return "Miercoles";
                case 4:
                    return "Jueves";
                case 5:
                    return "Viernes";
                case 6:
                    return "Sabado";
                default:
                    return "Domingo";
            }
        }

        public string CrearReserva(Reserva reservasACrear)
        {
            string canchita=reservasACrear.canchita.ToString();
            string cliente=reservasACrear.cliente.ToString();
            string dia=reservasACrear.dia;
            string hora=reservasACrear.hora;
            string cantidad = reservasACrear.cantidad;
            string rpta = "ok";

            if ((Int32.Parse(cantidad) + Int32.Parse(hora)) > 19)
            {
                throw new WebFaultException<Error>(
                     new Error()
                     {
                         codigoNegocio = "ERR001",
                         mensajeNegocio = "La cantidad de horas es incorrecta"
                     },
                         HttpStatusCode.InternalServerError);
            }

            List<Reserva> listReserva = new List<Reserva>();

            for (int i = 0; i < Int32.Parse(cantidad); i++)
            {
                int x = (Int32.Parse(hora) + i);
                string diax = x + "";

                HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create("http://localhost:23374/Reservas.svc/DiaHora/" + dia + "/" + diax);
                req2.Method = "GET";
                HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
                StreamReader reader2 = new StreamReader(res2.GetResponseStream());
                string alumnoJson2 = reader2.ReadToEnd();
                JavaScriptSerializer js2 = new JavaScriptSerializer();
                DiaHora diaReserva = js2.Deserialize<DiaHora>(alumnoJson2);

                //Verificar si La reserva existe
                Reserva reservaExiste=reservaDAO.ObtenerReservaDisponible(Int32.Parse(canchita), Int32.Parse(cliente), diaReserva.codigo);
                if(reservaExiste!=null){
                    throw new WebFaultException<Error>(
                     new Error()
                     {
                         codigoNegocio = "ERR002",
                         mensajeNegocio = "El horario seleccionado ya se encuentra reservado"
                     },
                         HttpStatusCode.InternalServerError);
                }
                

                //Reservar
                Reserva res = new Reserva();
                res.canchita = Int32.Parse(canchita);
                res.cliente = Int32.Parse(cliente);
                res.diaHora = diaReserva.codigo;
                res.estado = "0";
                res.fechaInicio = DateTime.Now;
                res.fechaFin = DateTime.Now;

                res.nomDia = evaluarDia(diaReserva.dia);
                res.nomHora = evaluarHora(diaReserva.hora);
                
                
                
                listReserva.Add(res);
               
                
            }

            for (int i = 0; i < listReserva.Count();i++ )
            {
                Reserva reservaAcrear = (Reserva)listReserva[i];
                reservaDAO.Crear(reservaAcrear);
            }

            return rpta;
        }



        public List<Reserva> ObtenerReservaFiltro(string codigoCancha, string dni)
        {

            ArrayList res = new ArrayList();
            if (!dni.Equals("0"))
            {
                HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create("http://localhost:26288/Clientes.svc/Clientes/" + dni);
                req2.Method = "GET";
                HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
                StreamReader reader2 = new StreamReader(res2.GetResponseStream());
                string alumnoJson2 = reader2.ReadToEnd();
                JavaScriptSerializer js2 = new JavaScriptSerializer();
                Cliente clienteObtenido = js2.Deserialize<Cliente>(alumnoJson2);

                res = reservaDAO.ObtenerFiltro(Int32.Parse(codigoCancha), clienteObtenido.codigo);
            }
            else
            {
                res = reservaDAO.ObtenerListado(Int32.Parse(codigoCancha));
            }
            

            List<Reserva> l = new List<Reserva>();
            Reserva r = new Reserva();
            for (int i = 0; i < res.Count; i++)
            {
                r = (Reserva)res[i];
                l.Add(r);

            }
            l.Count();
            return l;
        }

        public Dominio.Reserva ModificarReserva(Dominio.Reserva reservaAModificar)
        {
            return reservaDAO.Modificar(reservaAModificar);
        }

        public List<Dominio.Reserva> ListarReserva()
        {
            return (List<Dominio.Reserva>)reservaDAO.ListarTodos();
        }


        DiaHora IReserva.ObtenerDiaHora(string dia, string hora)
        {
            return reservaDAO.ObtenerDiaHora(Int32.Parse(dia), Int32.Parse(hora));
        }


        public Reserva ObtenerReserva(string id) {
            return reservaDAO.Obtener(Int32.Parse(id));
        }


        public List<Reserva> ListarReservaxConfirmar()
        {

            //Implementar Mensajeria
            string rutaCola = @".\private$\left4dead";
            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);
            MessageQueue cola = new MessageQueue(rutaCola);
            cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(Reserva) });
            Reserva reserva = null;
            Message mensaje = null;
            int cantidad = cola.GetAllMessages().Count();
            for (int i = 0; i < cantidad; i++)
            {
                mensaje = cola.Receive();
                reserva = (Reserva)mensaje.Body;

                reservaDAO.Modificar(reserva);
            };

            //Retornar el listado
            return (List<Dominio.Reserva>)reservaDAO.ListarTodosxConfirmar();
        }


        public Reserva EncolarReserva(Reserva reservaAModificar)
        {
            string rutaCola = @".\private$\left4dead";
            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);
            MessageQueue cola = new MessageQueue(rutaCola);
            Message mensaje = new Message();
            mensaje.Label = "Nueva Reserva";
            mensaje.Body = reservaAModificar;
            cola.Send(mensaje);
            return reservaAModificar;
        }


        public List<Reserva> ListarReservadas()
        {
            return (List<Dominio.Reserva>)reservaDAO.ListarTodosxConfirmar();
        }
    }
}
